home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Cream of the Crop 26
/
Cream of the Crop 26.iso
/
os2
/
pvm34b3.zip
/
pvm34b3
/
pvm3
/
examples
/
spmd.f
< prev
next >
Wrap
Text File
|
1997-07-22
|
3KB
|
95 lines
c
c $Id: spmd.f,v 1.3 1997/06/26 21:31:15 pvmsrc Exp $
c
c----------------------------------------
c SPMD Fortran example using PVM 3
c Illustrates use of new pvm3.4 call pvmfsiblings
c----------------------------------------
program spmd
include '../include/fpvm3.h'
PARAMETER( MAXNPROC=32 )
integer mytid, me, info
integer tids(0:MAXNPROC -1)
integer ntids
c -------------
c Enroll in pvm
c -------------
call pvmfmytid( mytid )
c --------------------------------------------
c Call pvmfsiblings to determine how many tasks were
c spawned with me.
c --------------------------------------------
me = -1
call pvmfsiblings(ntids, 0, tids(0))
if (ntids .gt. MAXNPROC) ntids = MAXNPROC
do i = 0, ntids - 1
call pvmfsiblings(ntids, i, tids(i))
if (tids(i) .eq. mytid) me = i
end do
if (me .eq. -1) then
call pvmfexit()
stop
endif
if (me .eq. 0) then
write (6,*) 'Pass a token through the', ntids, ' tid ring:'
write (6,6000) (tids(i), i=0, ntids-1), tids(0)
6000 format( 6(I7:, ' -> '))
end if
call dowork( me, ntids )
c -------------------------
c program finished exit pvm
c -------------------------
call pvmfexit(info)
stop
end
subroutine dowork( me, nproc )
include '../include/fpvm3.h'
c-------------------------------------------------
c Simple subroutine to pass a token around a ring
c-------------------------------------------------
integer me, nproc
integer token, src, dest, count, stride, msgtag
integer ndum
c -------------------------------
c Determine neighbors in the ring
c -------------------------------
call pvmfsiblings(ndum, me-1, src )
call pvmfsiblings(ndum, me+1, dest )
if( me .eq. 0 ) call pvmfsiblings( ndum, nproc-1, src )
if( me .eq. nproc - 1 ) call pvmfsiblings( ndum, 0, dest)
count = 1
stride = 1
msgtag = 4
if( me .eq. 0 ) then
token = dest
call pvmfinitsend( PVMDEFAULT, info )
call pvmfpack( INTEGER4, token, count, stride, info )
call pvmfsend( dest, msgtag, info )
call pvmfrecv( src, msgtag, info )
print*, 'token ring done'
else
call pvmfrecv( src, msgtag, info )
call pvmfunpack( INTEGER4, token, count, stride, info )
call pvmfinitsend( PVMDEFAULT, info )
call pvmfpack( INTEGER4, token, count, stride, info )
call pvmfsend( dest, msgtag, info )
endif
return
end